package com.runjian.rundo.iot.agent.iec104.consts;

/**
 * 类型标识符
 */
public enum Ti {

    /**
     * 接收 归一化值：通常表示将实际的物理量转换为一个范围内的数值，例如将电压或电流值转换为0到1之间的值 单点信息： 通常表示一个二进制状态，如开关状态（闭合或断开）
     * 双点信息：通常表示一个二进制状态，如开关状态（闭合或断开），并且包含质量标志（Quality Flag）。 不带时标：表示该信息对象不包含时间戳信息
     * 缩放值：通常表示将实际的物理量转换为一个范围内的数值，例如将电压或电流值转换为一个固定的缩放比例后的值。 M:测量值 ME: 进一步细化信息对象的类型，这里的 ME 通常代表 Measured Value（测量值）
     * SP：进一步细化信息对象的类型，这里的 SP 通常代表 Single Point（单点）。表示一个二进制状态，如开关状态。 DP：进一步细化信息对象的类型，这里的 DP 通常代表 Double
     * Point（双点）。表示一个二进制状态，通常包含两个位来表示开关状态以及质量标志。 ST：进一步细化信息对象的类型，这里的 ST 通常代表 Status（状态）。表示一个连续状态的测量值，通常用于表示模拟量的离散化版本。
     * BO：进一步细化信息对象的类型，这里的 BO 通常代表 Binary Output（二进制输出）。 NA：Not Time-tagged（不带时标）表示信息对象的具体类型，这里的 NA 通常代表 Not
     * Time-tagged（不带时标）。 NB：Scaled Value（标度化测量值）表示信息对象的具体类型，这里的 NB 通常代表 Scaled
     * Value（缩放值）,表示该信息对象是一个经过标度化的测量值，通常用于表示模拟量，如电压、电流等。 NC: Normalized Value（归一化测量值）表示信息对象的具体类型，这里的 NC 通常代表 Normalized
     * Value（归一化值）,表示该信息对象是一个经过归一化的测量值，通常用于表示模拟量，如电压、电流等。
     *
     *
     * 
     * 
     * 按制
     *
     * C:控制 SC：进一步细化信息对象的类型，这里的 SC 通常代表 Single Command（单点命令） SE：进一步细化信息对象的类型，这里的 SE 通常代表 Set Point（设定值）。 NA：表示信息对象的具体类型，这里的
     * NA 通常代表 Not Time-tagged（不带时标）。 NC：表示信息对象的具体类型，这里的 NC 通常代表 Not Time-tagged（不带时标）。 NB: 通常代表 With Quality
     * Information（带有质量信息）。
     *
     *
     *
     *
     * 参数 参数测量值：通常表示一个参数的测量值，如温度、压力或其他系统参数。 P：表示信息对象的类型，这里的 P 通常代表 Parameter（参数）。 ME：进一步细化信息对象的类型，这里的 ME 通常代表 Measured
     * Value（测量值）。 NA：表示信息对象的具体类型，这里的 NA 通常代表 Not Time-tagged（不带时标）。
     *
     * NC: 不带时标 F:文件传输
     */

    // ------监视方向的过程信息------
    /************************************** (遥信) ********************************************/
    M_SP_NA_1(1, "(遥信)单点信息"),

    M_DP_NA_1(3, "(遥信)双点信息"), M_PS_NA_1(20, "带状态检出的成组单点信息"), M_SP_TB_1(30, "(遥信)单点信息,带时标CP56Time2a的单点信息"),
    M_DP_TB_1(31, "(遥信)双点信息,带时标CP56Time2a的双点信息"),
    /************************************** (遥测) ********************************************/
    M_ME_NA_1(9, "(遥测)归一化值,带品质描述词"), M_ME_NB_1(11, "(遥测)标度化值,带品质描述词"), M_ME_NC_1(13, "(遥测)短浮点数,带品质描述词"), M_ME_ND_1(21, "不带品质描述的归一化测量值"),
    M_ME_TF_1(36, "(遥测)短浮点数,带品质描述词,带时标CP56Time2a的浮点型测量值"),

    /************************************** (基它) ********************************************/
    M_ST_NA_1(5, "步位置信息"), M_BO_NA_1(7, "32比特串"), M_IT_NA_1(15, "累计值"), M_ST_TB_1(32, "带时标CP56Time2a的步位置信息"),
    M_BO_TB_1(33, "带时标CP56Time2a的32比特串"), M_ME_TD_1(34, "带时标CP56Time2a的归一化测量值"), M_ME_TE_1(35, "带时标CP56Time2a的标量化测量值"),
    M_IT_TB_1(37, "带时标CP56Time2a的累计值"), M_EP_TD_1(38, "带时标CP56Time2a的继电器保护装置事件"), M_EP_TE_1(39, "带时标CP56Time2a的继电器保护装置成组启动事件"),
    M_EP_TF_1(40, "带时标CP56Time2a的继电器保护装置成组输出电路信息"), M_FT_NA_1(42, "故障事件信息"), M_IT_NB_1(206, "累计量，短浮点数 "),
    M_IT_TC_1(207, "带 CP56Time2a 时标的累计量，短浮点数"),
    /**
     * 类型表示1～15中，单数是不带时标的信息元素，双数是带时标CP24Time2a的对应信息元素。其对象格式，是给不带时标的信息元素格式的基础上+CP24Time2a。 引用的命名格式如下： M_ ：监视方向的信息元素 _Nx：不带时标
     * _Tx： 带时标 _xA：type A: 有质量描述副的状态或归一化值 _xB：type B: 有质量描述副的标量值 _xC：type C: 有质量描述副的浮点值 _xD：type D: 没有有质量描述副的归一化值
     * 信息对象格式描述了信息对象由那些信息元素组成。
     */

    // ------控制方向的过程信息------
    C_SC_NA_1(45, "(遥控)单命令"), C_DC_NA_1(46, "(遥控)双命令"), C_SC_NB_1(46, "(遥控)双命令"), C_RC_NA_1(47, "升降档命令"), C_RD_NA_1(102, "读单个参数命令(参数设置)"),
    C_RD_NA_2(132, "读多个参数命令(参数设置)"), C_SE_NA_1(48, "遥调设点,归一化(参数设置)"), C_SE_NB_1(49, "遥调设点,标度化(参数设置)"), C_SE_NC_1(50, "遥调设点,短浮点数(参数设置)"),
    C_SE_NA_2(136, "预置/激活多个参数命令(参数设置)"),

    // ------监视方向的系统信息------
    M_EI_NA_1(70, "初始化结束"),

    // ------控制方向的系统信息------
    C_IC_NA_1(100, "召唤命令"), C_CI_NA_1(101, "电能量召唤命令"), C_CS_NA_1(103, "时钟同步/读取命令"), C_TS_NA_1(104, "测试命令 "), C_RP_NA_1(105, "复位进程命令"),

    // ------控制方向的参数------
    P_ME_NA_1(110, "测量值参数,归一化数"), P_ME_NB_1(111, "测量值参数,标度化数"), P_ME_NC_1(112, "测量值参数,短浮点数"), P_AC_NA_1(113, "参数激活"),

    // ------文件传输------
    F_FR_NA_1(120, "文件已准备好"), F_SR_NA_1(121, "节已准备好"), F_SC_NA_1(122, "召唤目录/选择文件/召唤文件/召唤节"), F_LS_NA_1(123, "最后的节/最后的段"),
    F_AF_NA_1(124, "确认文件/确认节"), F_SG_NA_1(125, "段"), F_DR_TA_1(126, "目录"), F_SC_NB_1(127, "日志查询-请求存档文件");

    private short code;
    private String name;

    Ti(int code, String name) {
        this.code = (short)code;
        this.name = name;
    }

    public static Ti valueOfCode(short code) {
        for (Ti value : Ti.values()) {
            if (value.code == code) {
                return value;
            }
        }
        return null;
    }

    public String getName() {
        return name;
    }

    public short getCode() {
        return code;
    }

    public String getCodeHex() {
        return String.format("%02X", code);
    }
}
